import { useEffect } from 'react'
import { Link } from 'react-router-dom'
import { Field, Form, Formik, useFormikContext } from 'formik'
import { trpc, inferQueryOutput } from '~/utils/trpc'
import IVInputField from '~/components/IVInputField'
import IVButton from '~/components/IVButton'
import PageHeading from '~/components/PageHeading'
import { notify } from '~/components/NotificationCenter'
import { useHasPermission } from '~/components/DashboardContext'
import IconChevronRight from '~/icons/compiled/ChevronRight'
import { DialogStateReturn } from 'reakit'
import IVDialog, { useDialogState } from '~/components/IVDialog'
import EmptyState from '~/components/EmptyState'
import { pluralizeWithCount } from '~/utils/text'
import IVSpinner from '~/components/IVSpinner'
import { useOrgParams } from '~/utils/organization'
import IconClipboard from '~/icons/compiled/Clipboard'
import useCopyToClipboard from '~/utils/useCopyToClipboard'
import IVStatusPill from '~/components/IVStatusPill'
export default function GroupsPage() {
const { orgSlug } = useOrgParams()
const canAddUsers = useHasPermission('WRITE_USERS')
const groups = trpc.useQuery(['group.list'])
const addGroupDialog = useDialogState()
return (
{groups.data?.length ? (
) : groups.isLoading ? (
) : (
<>
Use Teams to restrict action access to a group of users.
>
)}
{canAddUsers && (
)}
)
}
function AddGroupDialog({
onSubmit,
dialog,
}: {
onSubmit?: () => void
dialog: DialogStateReturn
}) {
const addGroup = trpc.useMutation('group.add')
const { isSuccess } = addGroup
const { hide } = dialog
useEffect(() => {
if (isSuccess) {
hide()
notify.success('Team created')
if (onSubmit) {
onSubmit()
}
}
}, [isSuccess, onSubmit, hide])
const isHidden = !dialog.visible && !dialog.animating
const { reset: resetMutation } = addGroup
useEffect(() => {
if (isHidden) resetMutation()
}, [isHidden, resetMutation])
return (
initialValues={{
name: '',
}}
onSubmit={async ({ name }) => {
if (addGroup.isLoading) return
addGroup.mutate({
data: {
name,
},
})
}}
>
)
}
function ResetFormToken({ isResetReady }: { isResetReady: boolean }) {
const { resetForm } = useFormikContext()
useEffect(() => {
if (isResetReady) resetForm()
}, [resetForm, isResetReady])
return null
}
function GroupsList({
groups,
}: {
groups: inferQueryOutput<'group.list'>
onChange?: () => void
}) {
return (
{groups.map(group => (
))}
)
}
function GroupsListItem({
group,
}: {
group: inferQueryOutput<'group.list'>[0]
}) {
const { onCopyClick: copySlug } = useCopyToClipboard({
successMessage: 'Copied slug to clipboard',
})
return (
{group.name}
{group.scimGroupId &&
}
{pluralizeWithCount(group._count.memberships, 'member')}
)
}